import requests
import httpx
import asyncio
import aiohttp
import os
from selenium import webdriver
from playwright.sync_api import sync_playwright


"""
示例1 requests设置代理
对于 requests 来说，代理设置非常简单，我们只需要传入 proxies 参数即可。
"""

# proxy = '127.0.0.1:7890'
# proxies = {
#     'http': 'http://' + proxy,
#     'https': 'http://' + proxy,
# }
# try:
#     response = requests.get('https://www.instagram.com/', proxies=proxies)
#     print(response.text)
# except requests.exceptions.ConnectionError as e:
#     print('Error', e.args)


"""
 示例2 httpx设置代理  可以异步http请求  
 下载安装 pip install -U httpx
 httpx 新版已不再支持任何 proxies 参数！只能靠环境变量。
"""

# os.environ["HTTP_PROXY"] = "http://127.0.0.1:7890"
# os.environ["HTTPS_PROXY"] = "http://127.0.0.1:7890"
#
# async def main():
#     async with httpx.AsyncClient() as client:
#         response = await client.get("https://www.instagram.com/")
#         print(response.text)
#
# asyncio.run(main())


"""
 示例3  Selenium 同样可以设置代理，这里以 Chrome 为例来介绍其设置方法。
 对于无认证的代理，设置方法如下
"""

# proxy = '127.0.0.1:7890'
# options = webdriver.ChromeOptions()
# options.add_argument('--proxy-server=http://' + proxy)
# browser = webdriver.Chrome(options=options)
# browser.get('https://httpbin.org/get')
# print(browser.page_source)
# browser.close()



"""
  示例4 aiohttp 的代理设置   也是可以做异步请求的库
  对于 aiohttp 来说，我们可以通过 proxy 参数直接设置。HTTP 代理设置如下：
"""

# proxy = 'http://127.0.0.1:7890'
#
# async def main():
#     async with aiohttp.ClientSession() as session:
#         async with session.get('https://httpbin.org/get', proxy=proxy) as response:
#             print(await response.text())
#
#
# if __name__ == '__main__':
#     asyncio.get_event_loop().run_until_complete(main())



"""
 示例5  Playwright 的代理设置
 相对 Selenium 和 Pyppeteer 来说，Playwright 的代理设置更加方便，其预留了一个 proxy 参数，可以在启动 Playwright 的时候设置。
 对于 HTTP 代理来说，可以这样设置：
"""
with sync_playwright() as p:
    browser = p.chromium.launch(proxy={
        'server': 'http://127.0.0.1:7890'
    })
    page = browser.new_page()
    page.goto('https://httpbin.org/get')
    print(page.content())
    browser.close()